// Tencent is pleased to support the open source community by making
// 蓝鲸智云 - 监控平台/日志平台 (BlueKing - Monitor/Log) available.
// Copyright (C) 2017-2022 THL A29 Limited, a Tencent company. All rights reserved.
// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License.
// You may obtain a copy of the License at http://opensource.org/licenses/MIT
// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
//

package utils

type uniqueStrings struct {
	marker map[string]bool
	store  []string
}

func newUniqueStrings() *uniqueStrings {
	return &uniqueStrings{
		marker: make(map[string]bool),
		store:  make([]string, 0),
	}
}

func (us *uniqueStrings) Set(s string) {
	if us.marker[s] {
		return
	}

	us.marker[s] = true
	us.store = append(us.store, s)
}

func (us *uniqueStrings) Get() []string {
	return us.store
}

type MapUniqueStrings struct {
	store map[string]*uniqueStrings
}

func NewMapUniqueStrings() *MapUniqueStrings {
	return &MapUniqueStrings{store: make(map[string]*uniqueStrings)}
}

func (mus *MapUniqueStrings) Set(key, val string) {
	_, ok := mus.store[key]
	if !ok {
		mus.store[key] = newUniqueStrings()
	}
	mus.store[key].Set(val)
}

func (mus *MapUniqueStrings) Get(key string) []string {
	v, ok := mus.store[key]
	if !ok {
		return nil
	}
	return v.Get()
}

func (mus *MapUniqueStrings) Len() int {
	return len(mus.store)
}
